package ListNodeSecond.SwordOffer;

import ListNodeSecond.SwordOffer.ListNode;

import java.text.Collator;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Insert {
    /**
     *给定循环单调非递减列表中的一个点，写一个函数向这个列表中插入一个新元素 insertVal ，使这个列表仍然是循环升序的。
     *
     * 给定的可以是这个列表中任意一个顶点的指针，并不一定是这个列表中最小元素的指针。
     *
     * 如果有多个满足条件的插入位置，可以选择任意一个位置插入新的值，插入后整个列表仍然保持有序。
     *
     * 如果列表为空（给定的节点是 null），需要创建一个循环有序列表并返回这个节点。否则。请返回原先给定的节点。
     *
     * 输入：head = [3,4,1], insertVal = 2
     * 输出：[3,4,1,2]
     * 解释：在上图中，有一个包含三个元素的循环有序列表，你获得值为 3 的节点的指针，我们需要向表中插入元素 2 。新插入的节点应该在 1 和 3 之间，插入之后，整个列表如上图所示，最后返回节点 3 。
     *

     */
    /**
     * 插入位置有三种情况：
     * <p>
     * 插入值位于某两个数之间，即 cur.val <= insertVal <= cur.next.val。
     * 插入值比最大的大，即 insertVal >= cur.next >= cur.next.val。
     * 插入值比最小的小，即 cur.val >= cur.next.val >= insertVal。
     * 注意：后两种情况都是边界跳跃情况，且都满足：cur.val >= cur.next.val。
     * 此外，就是当head为空的情况，直接创建新节点，并将其next指向自己即可。
     * <p>
     * <p>
     * 没看懂
     *
     * @param head
     * @param insertVal
     * @return
     */
    public static ListNode insert(ListNode head, int insertVal) {
        if (head == null) {
            head = new ListNode(insertVal);
            head.next = head;
            return head;
        }
        ListNode cur = head;
        while (cur.next != head) {
            if (cur.next.val < cur.val) {
                if (insertVal >= cur.val) break;
                else if (cur.next.val > insertVal) break;
            }
            if (cur.val <= insertVal && cur.next.val >= insertVal) break;
            cur = cur.next;
        }
        ListNode listNode = new ListNode(insertVal, cur.next);
        cur.next = listNode;
        return cur;
    }


    public static void main(String[] args) {

//        ListNode listNode3 = new ListNode(3);
//        ListNode listNode4 = new ListNode(4);
//        ListNode listNode1 = new ListNode(1);
//
//        listNode3.next = listNode4;
//        listNode4.next = listNode1;
//        listNode1.next = listNode3;
//        insert(listNode3, 2);
//        System.out.println();

        List<String> list = Arrays.asList("0", "5", "10", "");
        List<String> collect = list.stream().sorted(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                try {
                    int int1 = Integer.parseInt(o1);
                    int int2 = Integer.parseInt(o2);
                    return int1 > int2 ? 1 : int1 == int2 ? 0 : -1;
                } catch (NumberFormatException e) {

                }
                return 0;
            }
        }).collect(Collectors.toList());
        System.out.println(collect);


    }

}
